package org.donald.optional;

import java.util.Optional;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 著名的NullPointerException 是引起系统失败最常见的原因。很久以前Google
 * Guava项目引入了Optional作为解决空指针异常的一种方式，不赞成代码被null检查的代码污染， 期望程序员写整洁的代码。受Google
 * Guava的鼓励，Optional 现在是Java 8库的一部分。
 * 
 * Optional 只是一个容器，它可以保存一些类型的值或者null。它提供很多有用的方法，所以没有理由不显式地检查null。
 * 请参照java8的文档查看详细信息。 如果Optional实例有非空的值，方法 isPresent()
 * 返回true否则返回false。方法orElseGet提供了回退机制，当Optional的值为空时接受一个方法返回默认值。map()
 * 方法转化Optional当前的值并且返回一个新的Optional实例。orElse方法和orElseGet类似，但是它不接受一个方法，而是接受一个默认值。
 * 
 * @author donald 2018年3月15日 上午8:48:47
 */
public class OptionalDemo {
	private static final Logger log = LoggerFactory.getLogger(OptionalDemo.class);
	public static void main(String[] args) {
		Optional<String> fullName = Optional.ofNullable(null);
		log.info("Full Name is seted ? :" + fullName.isPresent());
		log.info("Full Name: " + fullName.orElseGet(() -> "[none]"));
		log.info(fullName.map(s -> "Hey " + s + "!").orElse("Hey Stranger!"));
		fullName = Optional.of( "Donald" );
		log.info("Full Name is seted ? :" + fullName.isPresent());
		log.info("Full Name: " + fullName.orElseGet(() -> "[none]"));
		log.info(fullName.map(s -> "Hey " + s + "!").orElse("Hey Stranger!"));
	}
}
